Existing image processing techniques attempt to account for structure in images by analyzing relatively large sections of the images. As a result, these techniques are computationally intensive, and are often inappropriate for applications that have access to limited computational resources (e.g., mobile applications). Furthermore, existing image processing techniques typically do not enforce the preservation of image structure, so the processing they apply can lead to objectionable changes in image structure between the input and output images.